home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 0.9 version / MFOBJCTS.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-24  |  47.4 KB  |  1,475 lines  |  [TEXT/MPS ]

  1. #ifndef MF3DOBJECTS_H
  2. #define    MF3DOBJECTS_H
  3. /*==============================================================================
  4.  *
  5.  *    File:        MFOBJCTS.H
  6.  *
  7.  *    Function:    Structure definitions for all Metafile objects returned
  8.  *                by MF3DReadAnObject() or passed to MF3DWriteAnObject().
  9.  *
  10.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  11.  *
  12.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  13.  *
  14.  *    Change History (most recent first):
  15.  *        Fabio    Changed file name to 8 characters
  16.  *        F3K_RWW    GeneralPolygonHint.
  17.  *        F3A_RWW    MeshEdges and OrientationStyle.
  18.  *        F2S_RWW    BeginGroup changes.
  19.  *        F26_RWW    File created.
  20.  *==============================================================================
  21.  */
  22. #if defined(__COMPILING_ON_MACINTOSH__)
  23. #pragma once
  24. #endif
  25.  
  26. #include "MFSUBOBJ.H"
  27. #include "MFSYSTYP.H"
  28. #include "MFTYPES.H"
  29.  
  30. /*==============================================================================
  31.  *    Generic Object returned by MF3DReadAnObject
  32.  *
  33.  *    Use the objectType field to determine what kind of object this is.
  34.  *    Then, cast the pointer appropriately.
  35.  *==============================================================================
  36.  */
  37. #define    kMF3DObjInvalid                            0
  38.  
  39. typedef struct MF3DVoidObj
  40. {    MF3DObjHeader
  41. } MF3DVoidObj, *MF3DVoidObjPtr;
  42.  
  43. /*==============================================================================
  44.  *    Metafile Header
  45.  *
  46.  *    Always the first object returned by MF3DReadAnObject
  47.  *    Always the first object passed to MF3DWriteAnObject
  48.  *==============================================================================
  49.  */
  50. #define    kMF3DObjMetafile                        MF3DObjectType('3','D','M','F')
  51. #define    kMF3DObjMetafileSwapped                    MF3DObjectType('F','M','D','3')
  52. #define    kMF3DObjMetafileText                    "3DMetafile"
  53.  
  54. #define    kMF3DMaximumRefSeed        0x7FFFFFFF
  55. #define    kMF3DMinimumTypeSeed    0x80000000
  56.  
  57. enum
  58. {    kMF3DFormatNormal    = 0x00000000,
  59.     kMF3DFormatStream    = 0x00000001,
  60.     kMF3DFormatDatabase    = 0x00000002
  61. };
  62. typedef MF3DFlagData    MF3DMetafileFlags;    /* Metafile flags                */
  63.  
  64. typedef    struct MF3DMetafileObj
  65. {    MF3DObjHeader
  66.     MF3DDataFormatEnum            dataFormat;     /* binary, swapped, or text    */
  67.     MF3DUns16                      majorVersion;/* version of metafile format    */
  68.     MF3DUns16                      minorVersion;
  69.     MF3DMetafileFlags            flags;
  70.     MF3DUns32                    refSeed;     /* next available ref num        */
  71.     MF3DInt32                    typeSeed;     /* next available type num        */
  72.     MF3DPositionReferencePtr    tocLocation; /* table of contents            */
  73. } MF3DMetafileObj, *MF3DMetafileObjPtr;
  74.  
  75. /*==============================================================================
  76.  *    Reference
  77.  *
  78.  *    refID == 0 indicates an entire external file
  79.  *    (must be followed by storageObject)
  80.  *
  81.  *    Optionally followed by:
  82.  *        MF3DStorageObjPtr    storageObject;        { 0-1 }
  83.  *==============================================================================
  84.  */
  85. #define    kMF3DObjReference                        MF3DObjectType('r','f','r','n')
  86. #define    kMF3DObjReferenceText                    "Reference"
  87.  
  88. #define    kMF3DReferenceEntireFile    0
  89.  
  90. /* Examples of an MF3DStorageObj are:
  91.  * MF3DMacintoshPathObjPtr and MF3DUnixPathObjPtr
  92.  */
  93. typedef    struct MF3DStorageObj
  94. {    MF3DObjHeader
  95.     MF3DCStringPtr            pathName;
  96. } MF3DStorageObj, *MF3DStorageObjPtr;
  97.  
  98. typedef struct MF3DReferenceObj
  99. {    MF3DObjHeader
  100.     MF3DReferenceID        refID;                /* reference ID                    */
  101. } MF3DReferenceObj, *MF3DReferenceObjPtr;
  102.  
  103. /*==============================================================================
  104.  *    Container
  105.  *
  106.  *    The next object will be a root object.
  107.  *    All objects (until a matching EndContainer is returned) after the
  108.  *        root object are subobjects (modifiers) of the root object.
  109.  *==============================================================================
  110.  */
  111. #define    kMF3DObjContainer                        MF3DObjectType('c','n','t','r')
  112. #define    kMF3DObjContainerText                    "Container"
  113.  
  114. typedef    struct MF3DContainerObj
  115. {    MF3DObjHeader
  116. } MF3DContainerObj, *MF3DContainerObjPtr;
  117.  
  118. /*==============================================================================
  119.  *    EndContainer
  120.  *
  121.  *    The next object will be a root object.
  122.  *    All objects (until a matching EndContainer is returned) after the
  123.  *        root object are subobjects (modifiers) of the root object.
  124.  *==============================================================================
  125.  */
  126. /* ### NOTE: EndContainer is a phantom type (not in the QuickDraw 3D spec ### */
  127. #define    kMF3DObjEndContainer                    MF3DObjectType('e','n','d','c')
  128.  
  129. typedef    struct MF3DEndContainerObj
  130. {    MF3DObjHeader
  131. } MF3DEndContainerObj, *MF3DEndContainerObjPtr;
  132.  
  133. /*==============================================================================
  134.  *    BeginGroup
  135.  *==============================================================================
  136.  */
  137. #define    kMF3DObjBeginGroup                        MF3DObjectType('b','g','n','g')
  138. #define    kMF3DObjBeginGroupText                    "BeginGroup"
  139.  
  140. typedef    MF3DVoidObjPtr    MF3DAnyGroupObjPtr;
  141.  
  142. typedef    struct MF3DBeginGroupObj
  143. {    MF3DObjHeader
  144.     MF3DAnyGroupObjPtr            group;
  145.     MF3DDisplayGroupStateObjPtr    displayState;        /* (optional)            */
  146. } MF3DBeginGroupObj, *MF3DBeginGroupObjPtr;
  147.  
  148. /*==============================================================================
  149.  *    Group
  150.  *==============================================================================
  151.  */
  152. #define    kMF3DObjGroup                            MF3DObjectType('g','r','o','p')
  153. #define    kMF3DObjGroupText                        "Group"
  154.  
  155. typedef    struct MF3DGroupObj
  156. {    MF3DObjHeader
  157. } MF3DGroupObj, *MF3DGroupObjPtr;
  158.  
  159. /*==============================================================================
  160.  *    DisplayGroup (contains drawable objects)
  161.  *
  162.  *    Optionally followed by:
  163.  *        MF3DDisplayGroupStateObjPtr    displayGroupState;    { 0-1 }
  164.  *==============================================================================
  165.  */
  166. #define    kMF3DObjDisplayGroup                    MF3DObjectType('d','s','p','g')
  167. #define    kMF3DObjDisplayGroupText                "DisplayGroup"
  168.  
  169. typedef    struct MF3DDisplayGroupObj
  170. {    MF3DObjHeader
  171. } MF3DDisplayGroupObj, *MF3DDisplayGroupObjPtr;
  172.  
  173. /*==============================================================================
  174.  *    OrderedDisplayGroup
  175.  *
  176.  *    Optionally followed by:
  177.  *        MF3DDisplayGroupStateObjPtr    displayGroupState;    { 0-1 }
  178.  *==============================================================================
  179.  */
  180. #define    kMF3DObjOrderedDisplayGroup                MF3DObjectType('o','r','d','g')
  181. #define    kMF3DObjOrderedDisplayGroupText            "OrderedDisplayGroup"
  182.  
  183. typedef    struct MF3DOrderedDisplayGroupObj
  184. {    MF3DObjHeader
  185. } MF3DOrderedDisplayGroupObj, *MF3DOrderedDisplayGroupObjPtr;
  186.  
  187. /*==============================================================================
  188.  *    IOProxyDisplayGroup
  189.  *
  190.  *    Optionally followed by:
  191.  *        MF3DDisplayGroupStateObjPtr    displayGroupState;    { 0-1 }
  192.  *==============================================================================
  193.  */
  194. #define    kMF3DObjIOProxyDisplayGroup                MF3DObjectType('i','o','p','x')
  195. #define    kMF3DObjIOProxyDisplayGroupText            "IOProxyDisplayGroup"
  196.  
  197. typedef    struct MF3DIOProxyDisplayGroupObj
  198. {    MF3DObjHeader
  199. } MF3DIOProxyDisplayGroupObj, *MF3DIOProxyDisplayGroupObjPtr;
  200.  
  201. /*==============================================================================
  202.  *    InfoGroup
  203.  *==============================================================================
  204.  */
  205. #define    kMF3DObjInfoGroup                        MF3DObjectType('i','n','f','o')
  206. #define    kMF3DObjInfoGroupText                    "InfoGroup"
  207.  
  208. typedef    struct MF3DInfoGroupObj
  209. {    MF3DObjHeader
  210. } MF3DInfoGroupObj, *MF3DInfoGroupObjPtr;
  211.  
  212. /*==============================================================================
  213.  *    LightGroup
  214.  *==============================================================================
  215.  */
  216. #define    kMF3DObjLightGroup                        MF3DObjectType('l','g','h','g')
  217. #define    kMF3DObjLightGroupText                    "LightGroup"
  218.  
  219. typedef    struct MF3DLightGroupObj
  220. {    MF3DObjHeader
  221. } MF3DLightGroupObj, *MF3DLightGroupObjPtr;
  222.  
  223. /*==============================================================================
  224.  *    EndGroup
  225.  *==============================================================================
  226.  */
  227. #define kMF3DObjEndGroup                        MF3DObjectType('e','n','d','g')
  228. #define    kMF3DObjEndGroupText                    "EndGroup"
  229.  
  230. typedef struct MF3DEndGroupObj
  231. {    MF3DObjHeader
  232. } MF3DEndGroupObj, *MF3DEndGroupObjPtr;
  233.  
  234. /*==============================================================================
  235.  *    Interactive Renderer
  236.  *==============================================================================
  237.  */
  238. #define kMF3DObjRendererInteractive                MF3DObjectType('c','t','w','n')
  239. #define    kMF3DObjRendererInteractiveText            "InteractiveRenderer"
  240.  
  241. typedef struct MF3DInteractiveRendererObj
  242. {    MF3DObjHeader
  243. } MF3DInteractiveRendererObj, *MF3DInteractiveRendererObjPtr;
  244.  
  245. /*==============================================================================
  246.  *    GenericRenderer (does nothing)
  247.  *==============================================================================
  248.  */
  249. #define    kMF3DObjRendererGeneric                    MF3DObjectType('g','n','r','r')
  250. #define    kMF3DObjRendererGenericText                "GenericRenderer"
  251.  
  252. typedef struct MF3DGenericRendererObj
  253. {    MF3DObjHeader
  254. } MF3DGenericRendererObj, *MF3DGenericRendererObjPtr;
  255.  
  256. /*==============================================================================
  257.  *    WireFrame Renderer
  258.  *==============================================================================
  259.  */
  260. #define    kMF3DObjRendererWireFrame                MF3DObjectType('w','r','f','r')
  261. #define    kMF3DObjRendererWireFrameText            "WireFrame"
  262.  
  263. typedef struct MF3DWireFrameObj
  264. {    MF3DObjHeader
  265. } MF3DWireFrameObj, *MF3DWireFrameObjPtr;
  266.  
  267. /*==============================================================================
  268.  *    ZBuffer Renderer
  269.  *==============================================================================
  270.  */
  271. #define    kMF3DObjRendererZBuffer                    MF3DObjectType('z','b','u','f')
  272. #define    kMF3DObjRendererZBufferText                "ZBuffer"
  273.  
  274. typedef struct MF3DZBufferObj
  275. {    MF3DObjHeader
  276. } MF3DZBufferObj, *MF3DZBufferObjPtr;
  277.  
  278. /*==============================================================================
  279.  *    OrthographicCamera
  280.  *
  281.  *    left < right
  282.  *    bottom < top
  283.  *
  284.  *    Optionally followed by:
  285.  *        MF3DCameraPlacementObjPtr    cameraPlacement;    { 0-1 }
  286.  *        MF3DCameraRangeObjPtr        cameraRange;        { 0-1 }
  287.  *        MF3DCameraViewPortObjPtr    cameraViewPort;        { 0-1 }
  288.  *==============================================================================
  289.  */
  290. #define    kMF3DObjOrthographicCamera                MF3DObjectType('o','r','t','h')
  291. #define    kMF3DObjOrthographicCameraText            "OrthographicCamera"
  292.  
  293. typedef struct MF3DOrthographicCameraObj
  294. {    MF3DObjHeader
  295.     MF3DFloat32                    left;
  296.     MF3DFloat32                    top;
  297.     MF3DFloat32                    right;
  298.     MF3DFloat32                    bottom;
  299. } MF3DOrthographicCameraObj, *MF3DOrthographicCameraObjPtr;
  300.  
  301. /*==============================================================================
  302.  *    ViewAngleAspectCamera
  303.  *
  304.  *    0 < fieldOfView <= pi
  305.  *    0 < aspectRatioXtoY
  306.   *
  307.  *    Optionally followed by:
  308.  *        MF3DCameraPlacementObjPtr    cameraPlacement;    { 0-1 }
  309.  *        MF3DCameraRangeObjPtr        cameraRange;        { 0-1 }
  310.  *        MF3DCameraViewPortObjPtr    cameraViewPort;        { 0-1 }
  311. *==============================================================================
  312.  */
  313. #define    kMF3DObjViewAngleAspectCamera            MF3DObjectType('v','a','n','a')
  314. #define    kMF3DObjViewAngleAspectCameraText        "ViewAngleAspectCamera"
  315.  
  316. typedef struct MF3DViewAngleAspectCameraObj
  317. {    MF3DObjHeader
  318.     MF3DFloat32                    fieldOfView;
  319.     MF3DFloat32                    aspectRatioXtoY;
  320. } MF3DViewAngleAspectCameraObj, *MF3DViewAngleAspectCameraObjPtr;
  321.  
  322. /*==============================================================================
  323.  *    ViewPlaneCamera
  324.  *
  325.  *    0 < viewPlane
  326.  *    0 < halfWidthAtViewPlane
  327.  *    0 < halfHeightAtViewPlane
  328.  *    centerXOnViewPlane, centerYOnViewPlane may be any value
  329.  *
  330.  *    Optionally followed by:
  331.  *        MF3DCameraPlacementObjPtr    cameraPlacement;    { 0-1 }
  332.  *        MF3DCameraRangeObjPtr        cameraRange;        { 0-1 }
  333.  *        MF3DCameraViewPortObjPtr    cameraViewPort;        { 0-1 }
  334.  *==============================================================================
  335.  */
  336. #define    kMF3DObjViewPlaneCamera                    MF3DObjectType('v','w','p','l')
  337. #define    kMF3DObjViewPlaneCameraText                "ViewPlaneCamera"
  338.  
  339. typedef struct MF3DViewPlaneCameraObj
  340. {    MF3DObjHeader
  341.     MF3DFloat32                    viewPlane;
  342.     MF3DFloat32                    halfWidthAtViewPlane;
  343.     MF3DFloat32                    halfHeightAtViewPlane;
  344.     MF3DFloat32                    centerXOnViewPlane;
  345.     MF3DFloat32                    centerYOnViewPlane;
  346. } MF3DViewPlaneCameraObj, *MF3DViewPlaneCameraObjPtr;
  347.  
  348. /*==============================================================================
  349.  *    Box
  350.  *
  351.  *    For 0-sized objects, default is:
  352.  *        1 0 0 # orientation
  353.  *        0 1 0 # majorAxis
  354.  *        0 0 1 # minorAxis
  355.  *        0 0 0 # origin
  356.  *
  357.  *    Optionally followed by:
  358.  *        MF3DFaceAttributeSetListObjPtr    faceAttributes;    { 0-1, nFaces = 6 }
  359.  *        MF3DAttributeSetListObjPtr        attributes;        { 0-1 }
  360.  *==============================================================================
  361.  */
  362. #define    kMF3DObjBox                                MF3DObjectType('b','o','x',' ')
  363. #define    kMF3DObjBoxText                            "Box"
  364.  
  365. typedef struct MF3DBoxData
  366. {    MF3DVector3D                orientation;
  367.     MF3DVector3D                majorAxis;
  368.     MF3DVector3D                minorAxis;
  369.     MF3DPoint3D                    origin;
  370. } MF3DBoxData, *MF3DBoxDataPtr;
  371.  
  372. typedef struct MF3DBoxObj
  373. {    MF3DObjHeader
  374.     MF3DBoxDataPtr                box;                /* (optional)            */
  375. } MF3DBoxObj, *MF3DBoxObjPtr;
  376.  
  377. /*==============================================================================
  378.  *    Cone
  379.  *
  380.  *    For 0-sized objects, default is:
  381.  *        1 0 0 # orientation
  382.  *        0 1 0 # majorAxis
  383.  *        0 0 1 # minorAxis
  384.  *        0 0 0 # origin
  385.  *
  386.  *    Optionally followed by:
  387.  *        MF3DCapsObjPtr                        caps;                    { 0-1 }
  388.  *        MF3DFaceCapAttributeSetObjPtr        faceCapAttributes;        { 0-1 }
  389.  *        MF3DBottomCapAttributeSetObjPtr        bottomCapAttributes;    { 0-1 }
  390.  *        MF3DAttributeSetListObjPtr            attributes;                { 0-1 }
  391.  *==============================================================================
  392.  */
  393. #define    kMF3DObjCone                            MF3DObjectType('c','o','n','e')
  394. #define    kMF3DObjConeText                        "Cone"
  395.  
  396. typedef struct MF3DConeData
  397. {    MF3DVector3D                orientation;
  398.     MF3DVector3D                majorAxis;
  399.     MF3DVector3D                minorAxis;
  400.     MF3DPoint3D                    origin;
  401. } MF3DConeData, *MF3DConeDataPtr;
  402.  
  403. typedef struct MF3DConeObj
  404. {    MF3DObjHeader
  405.     MF3DConeDataPtr                cone;                    /* (optional)        */
  406. } MF3DConeObj, *MF3DConeObjPtr;
  407.  
  408. /*==============================================================================
  409.  *    Cylinder
  410.  *
  411.  *    For 0-sized objects, default is:
  412.  *        1 0 0 # orientation
  413.  *        0 1 0 # majorAxis
  414.  *        0 0 1 # minorAxis
  415.  *        0 0 0 # origin
  416.  *
  417.  *    Optionally followed by:
  418.  *        MF3DCapsObjPtr                        caps;                    { 0-1 }
  419.  *        MF3DTopCapAttributeSetObjPtr        topCapAttributes;        { 0-1 }
  420.  *        MF3DFaceCapAttributeSetObjPtr        faceCapAttributes;        { 0-1 }
  421.  *        MF3DBottomCapAttributeSetObjPtr        bottomCapAttributes;    { 0-1 }
  422.  *        MF3DAttributeSetListObjPtr            attributes;                { 0-1 }
  423.  *==============================================================================
  424.  */
  425. #define    kMF3DObjCylinder                        MF3DObjectType('c','y','l','n')
  426. #define    kMF3DObjCylinderText                    "Cylinder"
  427.  
  428. typedef struct MF3DCylinderData
  429. {    MF3DVector3D                orientation;
  430.     MF3DVector3D                majorAxis;
  431.     MF3DVector3D                minorAxis;
  432.     MF3DPoint3D                    origin;
  433. } MF3DCylinderData, *MF3DCylinderDataPtr;
  434.  
  435. typedef struct MF3DCylinderObj
  436. {    MF3DObjHeader
  437.     MF3DCylinderDataPtr            cylinder;                /* (optional)        */
  438. } MF3DCylinderObj, *MF3DCylinderObjPtr;
  439.  
  440. /*==============================================================================
  441.  *    Disk
  442.  *
  443.  *    For 0-sized objects, default is:
  444.  *        1 0 0 # majorRadius
  445.  *        0 1 0 # minorRadius
  446.  *        0 0 0 # origin
  447.  *
  448.  *    Optionally followed by:
  449.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  450.  *==============================================================================
  451.  */
  452. #define    kMF3DObjDisk                            MF3DObjectType('d','i','s','k')
  453. #define    kMF3DObjDiskText                        "Disk"
  454.  
  455. typedef struct MF3DDiskData
  456. {    MF3DObjHeader
  457.     MF3DVector3D                majorRadius;
  458.     MF3DVector3D                minorRadius;
  459.     MF3DPoint3D                    origin;
  460. } MF3DDiskData, *MF3DDiskDataPtr;
  461.  
  462. typedef struct MF3DDiskObj
  463. {    MF3DObjHeader
  464.     MF3DDiskDataPtr                    disk;                /* (optional)        */
  465. } MF3DDiskObj, *MF3DDiskObjPtr;
  466.  
  467. /*==============================================================================
  468.  *    Ellipse
  469.  *
  470.  *    For 0-sized objects, default is:
  471.  *        1 0 0 # majorAxis
  472.  *        0 1 0 # minorAxis
  473.  *        0 0 0 # origin
  474.  *
  475.  *    Optionally followed by:
  476.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  477.  *==============================================================================
  478.  */
  479. #define    kMF3DObjEllipse                            MF3DObjectType('e','l','p','s')
  480. #define    kMF3DObjEllipseText                        "Ellipse"
  481.  
  482. typedef    struct MF3DEllipseData
  483. {    MF3DVector3D                majorAxis;
  484.     MF3DVector3D                minorAxis;
  485.     MF3DPoint3D                    origin;
  486. } MF3DEllipseData, *MF3DEllipseDataPtr;
  487.  
  488. typedef struct MF3DEllipseObj
  489. {    MF3DObjHeader
  490.     MF3DEllipseDataPtr            ellipse;                /* (optional)        */
  491. } MF3DEllipseObj, *MF3DEllipseObjPtr;
  492.  
  493. /*==============================================================================
  494.  *    Ellipsoid
  495.  *
  496.  *    For 0-sized objects, default is:
  497.  *        1 0 0 # orientation
  498.  *        0 1 0 # majorAxis
  499.  *        0 0 1 # minorAxis
  500.  *        0 0 0 # origin
  501.  *
  502.  *    Optionally followed by:
  503.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  504.  *==============================================================================
  505.  */
  506. #define    kMF3DObjEllipsoid                        MF3DObjectType('e','l','p','d')
  507. #define    kMF3DObjEllipsoidText                    "Ellipsoid"
  508.  
  509. typedef    struct MF3DEllipsoidData
  510. {    MF3DVector3D                orientation;
  511.     MF3DVector3D                majorRadius;
  512.     MF3DVector3D                minorRadius;
  513.     MF3DPoint3D                    origin;
  514. } MF3DEllipsoidData, *MF3DEllipsoidDataPtr;
  515.  
  516. typedef struct MF3DEllipsoidObj
  517. {    MF3DObjHeader
  518.     MF3DEllipsoidDataPtr        ellipsoid;                /* (optional)        */
  519. } MF3DEllipsoidObj, *MF3DEllipsoidObjPtr;
  520.  
  521. /*==============================================================================
  522.  *    GeneralPolygonHint
  523.  *==============================================================================
  524.  */
  525. #define    kMF3DObjGeneralPolygonHint                MF3DObjectType('g','p','l','h')
  526. #define    kMF3DObjGeneralPolygonHintText            "GeneralPolygonHint"
  527.  
  528. enum MF3DGeneralPolygonHintEnum
  529. {    MF3DShapeComplex        = 0x00000000,
  530.     MF3DShapeConcave        = 0x00000001,
  531.     MF3DShapeConvex            = 0x00000002,
  532.     MF3DShapeUnknown        = MF3DShapeComplex
  533. };
  534. typedef    MF3DEnumData    MF3DGeneralPolygonHintEnum;
  535.  
  536. typedef struct MF3DGeneralPolygonHintObj
  537. {    MF3DObjHeader
  538.     MF3DGeneralPolygonHintEnum    shapeHint;
  539. } MF3DGeneralPolygonHintObj, *MF3DGeneralPolygonHintObjPtr;
  540.  
  541. /*==============================================================================
  542.  *    GeneralPolygon
  543.  *
  544.  *    0 < nContours
  545.  *    2 < nVertices
  546.  *
  547.  *    Optionally followed by:
  548.  *        { nVertices = sum(nContours.nVertices }
  549.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1 }
  550.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  551.  *        MF3DGeneralPolygonHintObjPtr        polygonHint;        { 0-1 }
  552.  *==============================================================================
  553.  */
  554. #define    kMF3DObjGeneralPolygon                    MF3DObjectType('g','p','g','n')
  555. #define    kMF3DObjGeneralPolygonText                "GeneralPolygon"
  556.  
  557. typedef struct MF3DPolygonData
  558. {    MF3DUns32                nVertices;
  559.     MF3DPoint3DPtr            vertices;            /* size: nVertices            */
  560. } MF3DPolygonData, *MF3DPolygonDataPtr;
  561.  
  562. typedef struct MF3DGeneralPolygonObj
  563. {    MF3DObjHeader
  564.     MF3DUns32                nContours;
  565.     MF3DPolygonDataPtr        polygons;            /* size: nContours            */
  566. } MF3DGeneralPolygonObj, *MF3DGeneralPolygonObjPtr;
  567.  
  568. /*==============================================================================
  569.  *    Line
  570.  *
  571.  *    Optionally followed by:
  572.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1, nV = 2 }
  573.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  574.  *==============================================================================
  575.  */
  576. #define    kMF3DObjLine                            MF3DObjectType('l','i','n','e')
  577. #define    kMF3DObjLineText                        "Line"
  578.  
  579. typedef struct MF3DLineObj
  580. {    MF3DObjHeader
  581.     MF3DPoint3D                    start;
  582.     MF3DPoint3D                    end;
  583. } MF3DLineObj, *MF3DLineObjPtr;
  584.  
  585. /*==============================================================================
  586.  *    Marker
  587.  *
  588.  *    0 < width
  589.  *    0 < height
  590.  *    (((width / 8) + ((width & 7) > 0)) ≤ rowBytes
  591.  *
  592.  *    Optionally followed by:
  593.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  594.  *==============================================================================
  595.  */
  596. #define    kMF3DObjMarker                            MF3DObjectType('m','r','k','r')
  597. #define    kMF3DObjMarkerText                        "Marker"
  598.  
  599. typedef struct MF3DMarkerObj
  600. {    MF3DObjHeader
  601.     MF3DPoint3D                    location;
  602.     MF3DUns32                    width;
  603.     MF3DUns32                    height;
  604.     MF3DUns32                    rowBytes;
  605.     MF3DInt32                    xOffset;
  606.     MF3DInt32                    yOffset;
  607.     MF3DRawDataPtr                data;                /* size: height*rowBytes */
  608. } MF3DMarkerObj, *MF3DMarkerObjPtr;
  609.  
  610. /*==============================================================================
  611.  *    Mesh
  612.  *
  613.  *    3 <= nVertices
  614.  *    3 <= nFaceVertexIndices
  615.  *
  616.  *    Optionally followed by:
  617.  *        MF3DFaceAttributeSetListObjPtr     faceAttributes;    { 0-1, nFaces }
  618.  *        MF3DVertexAttributeSetListObjPtr vertexAttributes;    { 0-1, nVertices }
  619.  *        MF3DMeshCornersObjPtr             meshCorners;        { 0-1 }
  620.  *        MF3DMeshEdgesObjPtr                 meshEdges;            { 0-1 }
  621.  *        MF3DAttributeSetListObjPtr         attributes;        { 0-1 }
  622.  *==============================================================================
  623.  */
  624. #define    kMF3DObjMesh                            MF3DObjectType('m','e','s','h')
  625. #define    kMF3DObjMeshText                        "Mesh"
  626.  
  627. typedef struct MF3DMeshFace
  628. {    MF3DUns32        nFaceVertexIndices;
  629.     MF3DUns32Ptr    faceVertexIndices;            /* size: nFaceVertexIndices    */
  630. } MF3DMeshFace, *MF3DMeshFacePtr;
  631.  
  632. typedef struct MF3DMeshObj
  633. {    MF3DObjHeader
  634.     MF3DUns32                nVertices;
  635.     MF3DPoint3DPtr            vertices;            /* size: nVertices            */
  636.     MF3DUns32                nFaces;
  637.     MF3DUns32                nContours;
  638.     MF3DMeshFacePtr            faces;                /* size: nFaces + nContours    */
  639. } MF3DMeshObj, *MF3DMeshObjPtr;
  640.  
  641. /*==============================================================================
  642.  *    NURBCurve
  643.  *
  644.  *    2 <= order
  645.  *    2 <= nPoints
  646.  *    0 < points[...].w (weights of points)
  647.  *==============================================================================
  648.  */
  649. #define    kMF3DObjNURBCurve                        MF3DObjectType('n','r','b','c')
  650. #define    kMF3DObjNURBCurveText                    "NURBCurve"
  651.  
  652. typedef    MF3DFloat32    MF3DKnot, *MF3DKnotPtr;
  653.  
  654. typedef struct MF3DNURBCurveObj
  655. {    MF3DObjHeader
  656.     MF3DUns32                order;
  657.     MF3DUns32                nPoints;
  658.     MF3DRationalPoint4DPtr    points;                /* size: nPoints            */
  659.     MF3DKnotPtr                knots;                /* size: order + nPoints    */
  660. } MF3DNURBCurveObj, *MF3DNURBCurveObjPtr;
  661.  
  662. /*==============================================================================
  663.  *    NURBCurve2D
  664.  *
  665.  *    2 ≤ order
  666.  *    2 ≤ nPoints
  667.  *    0 < points[...].w (weights of points)
  668.  *==============================================================================
  669.  */
  670. #define    kMF3DObjNURBCurve2D                        MF3DObjectType('n','b','2','c')
  671. #define    kMF3DObjNURBCurve2DText                    "NURBCurve2D"
  672.  
  673. typedef struct MF3DNURBCurve2DObj
  674. {    MF3DObjHeader
  675.     MF3DUns32                order;
  676.     MF3DUns32                nPoints;
  677.     MF3DRationalPoint3DPtr    points;                /* size: nPoints            */
  678.     MF3DKnotPtr                knots;                /* size: order + nPoints    */
  679. } MF3DNURBCurve2DObj, *MF3DNURBCurve2DObjPtr;
  680.  
  681. /*==============================================================================
  682.  *    NurbPatch
  683.  *
  684.  *    2 <= uOrder
  685.  *    2 <= vOrder
  686.  *    2 <= numColumns
  687.  *    2 <= numRows
  688.  *    0 < points[...].w (weights of points)
  689.  *
  690.  *    Optionally followed by:
  691.  *        MF3DTrimCurvesObjPtr    trimCurves;        { 0-1, nTrimCurves = 1 to many }
  692.  *==============================================================================
  693.  */
  694. #define    kMF3DObjNURBPatch                        MF3DObjectType('n','r','b','p')
  695. #define    kMF3DObjNURBPatchText                    "NURBPatch"
  696.  
  697. typedef    struct MF3DNurbPatchObj
  698. {    MF3DObjHeader
  699.     MF3DUns32                uOrder;
  700.     MF3DUns32                vOrder;
  701.     MF3DUns32                numColumns;
  702.     MF3DUns32                numRows;
  703.     MF3DRationalPoint4DPtr    points;                /* size: numColumns*numRows    */
  704.     MF3DKnotPtr                uKnots;                /* size: uOrder + numColumn    */
  705.     MF3DKnotPtr                vKnots;                /* size: vOrder + numRows    */
  706. } MF3DNurbPatchObj, *MF3DNurbPatchObjPtr;
  707.  
  708. /*==============================================================================
  709.  *    Point
  710.  *
  711.  *    Optionally followed by:
  712.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  713.  *==============================================================================
  714.  */
  715. #define    kMF3DObjPoint                            MF3DObjectType('p','n','t',' ')
  716. #define    kMF3DObjPointText                        "Point"
  717.  
  718. typedef    struct MF3DPointObj
  719. {    MF3DObjHeader
  720.     MF3DPoint3D                point;
  721. } MF3DPointObj, *MF3DPointObjPtr;
  722.  
  723. /*==============================================================================
  724.  *    Polygon
  725.  *
  726.  *    2 <= nVertices
  727.  *
  728.  *    Optionally followed by:
  729.  *        MF3DVertexAttributeSetListObjPtr vertexAttributes;    { 0-1, nVertices }
  730.  *        MF3DAttributeSetListObjPtr         attributes;        { 0-1 }
  731.  *==============================================================================
  732.  */
  733. #define    kMF3DObjPolygon                            MF3DObjectType('p','l','y','g')
  734. #define    kMF3DObjPolygonText                        "Polygon"
  735.  
  736. typedef    struct MF3DPolygonObj
  737. {    MF3DObjHeader
  738.     MF3DUns32                nVertices;
  739.     MF3DPoint3DPtr            vertices;            /* size: nVertices    */
  740. } MF3DPolygonObj, *MF3DPolygonObjPtr;
  741.  
  742. /*==============================================================================
  743.  *    PolyLine
  744.  *
  745.  *    2 <= nVertices
  746.  *
  747.  *    Optionally followed by:
  748.  *        { nVertices }
  749.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1 }
  750.  *        { nGeometries = nVertices - 1 }
  751.  *        MF3DGeometryAttributeSetListObjPtr    geometryAttributes;    { 0-1 }
  752.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  753.  *==============================================================================
  754.  */
  755. #define    kMF3DObjPolyLine                        MF3DObjectType('p','l','y','l')
  756. #define    kMF3DObjPolyLineText                    "PolyLine"
  757.  
  758. typedef    struct MF3DPolyLineObj
  759. {    MF3DObjHeader
  760.     MF3DUns32                nVertices;
  761.     MF3DPoint3DPtr            vertices;            /* size: nVertices    */
  762. } MF3DPolyLineObj, *MF3DPolyLineObjPtr;
  763.  
  764. /*==============================================================================
  765.  *    Torus
  766.  *
  767.  *    For 0-sized objects, default is:
  768.  *
  769.  *    1 0 0 # orientation
  770.  *    0 1 0 # majorAxis
  771.  *    0 0 1 # minorAxis
  772.  *    0 0 0 # origin
  773.  *    1     # ratio
  774.  *
  775.  *    Optionally followed by:
  776.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  777.  *==============================================================================
  778.  */
  779. #define    kMF3DObjTorus                            MF3DObjectType('t','o','r','s')
  780. #define    kMF3DObjTorusText                        "Torus"
  781.  
  782. typedef    struct MF3DTorusData
  783. {    MF3DVector3D            orientation;
  784.     MF3DVector3D            majorAxis;
  785.     MF3DVector3D            minorAxis;
  786.     MF3DPoint3D                origin;
  787.     MF3DFloat32                ratio;
  788. } MF3DTorusData, *MF3DTorusDataPtr;
  789.  
  790. typedef    struct MF3DTorusObj
  791. {    MF3DObjHeader
  792.     MF3DTorusDataPtr        torus;                /* (optional)                */
  793. } MF3DTorusObj, *MF3DTorusObjPtr;
  794.  
  795. /*==============================================================================
  796.  *    Triangle
  797.  *
  798.  *    Optionally followed by:
  799.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1, n = 3 }
  800.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  801.  *==============================================================================
  802.  */
  803. #define    kMF3DObjTriangle                        MF3DObjectType('t','r','n','g')
  804. #define    kMF3DObjTriangleText                    "Triangle"
  805.  
  806. typedef    struct MF3DTriangleObj
  807. {    MF3DObjHeader
  808.     MF3DPoint3D                vertex1;
  809.     MF3DPoint3D                vertex2;
  810.     MF3DPoint3D                vertex3;
  811. } MF3DTriangleObj, *MF3DTriangleObjPtr;
  812.  
  813. /*==============================================================================
  814.  *    TriGrid
  815.  *
  816.  *    2 ≥ numRows
  817.  *    2 ≥ numColumns
  818.  *
  819.  *    vertices are specified in row-major order. For example:
  820.  *
  821.  *    numRows = 2, numColumns = 4
  822.  *
  823.  *        col0 col1 col2 col3
  824.  *    row0   p1   p2   p3   p4
  825.  *  row1   p5   p6   p7   p8
  826.  *
  827.  *    In the metafile, vertices are specified
  828.  *    p1 p2 p3 p4 p5 p6 p7 p8
  829.  *
  830.  *    Optionally followed by:
  831.  *        { nFaces = (numRows - 1) * (numColumns - 1) * 2 }
  832.  *        MF3DFaceAttributeSetListObjPtr        faceAttributes;        { 0-1 }
  833.  *        { nVertices = numRows * numColumns }
  834.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1 }
  835.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  836.  *==============================================================================
  837.  */
  838. #define    kMF3DObjTriGrid                            MF3DObjectType('t','r','i','g')
  839. #define    kMF3DObjTriGridText                        "TriGrid"
  840.  
  841. typedef    struct MF3DTriGridObj
  842. {    MF3DObjHeader
  843.     MF3DUns32                numRows;
  844.     MF3DUns32                numColumns;
  845.     MF3DPoint3DPtr            vertices;            /* size: numColumns * numRows */
  846. } MF3DTriGridObj, *MF3DTriGridObjPtr;
  847.  
  848. /*==============================================================================
  849.  *    LightData
  850.  *
  851.  *    0 ≤ intensity ≤ 1
  852.  *==============================================================================
  853.  */
  854. #define    kMF3DObjLightData                        MF3DObjectType('l','g','h','t')
  855. #define    kMF3DObjLightDataText                    "LightData"
  856.  
  857. #define    MF3DLightDataIsOnDefault        true
  858. #define    MF3DLightDataIntensityDefault    1.0
  859. #define    MF3DLightDataColorDefault        { 1, 1, 1 }
  860.  
  861. typedef struct MF3DLightDataObj
  862. {    MF3DObjHeader
  863.     MF3DBoolean            isOn;
  864.     MF3DFloat32            intensity;                    /* 0 <= intensity <= 1    */
  865.     MF3DRGBColor        color;
  866. } MF3DLightDataObj, *MF3DLightDataObjPtr;
  867.  
  868. /*==============================================================================
  869.  *    AmbientLight
  870.  *
  871.  *    Optionally followed by:
  872.  *        MF3DLightDataObjPtr        lightData;            { 0-1 }
  873.  *==============================================================================
  874.  */
  875. #define    kMF3DObjAmbientLight                    MF3DObjectType('a','m','b','n')
  876. #define    kMF3DObjAmbientLightText                "AmbientLight"
  877.  
  878. typedef    struct MF3DAmbientLightObj
  879. {    MF3DObjHeader
  880. } MF3DAmbientLightObj, *MF3DAmbientLightObjPtr;
  881.  
  882. /*==============================================================================
  883.  *    DirectionalLight
  884.  *
  885.  *    |direction| = 1.0
  886.  *
  887.  *    Optionally followed by:
  888.  *        MF3DLightDataObjPtr        lightData;            { 0-1 }
  889.  *==============================================================================
  890.  */
  891. #define    kMF3DObjDirectionalLight                MF3DObjectType('d','r','c','t')
  892. #define    kMF3DObjDirectionalLightText            "DirectionalLight"
  893.  
  894. typedef    struct MF3DDirectionalLightObj
  895. {    MF3DObjHeader
  896.     MF3DVector3D            direction;
  897.     MF3DBoolean                castsShadows;
  898. } MF3DDirectionalLightObj, *MF3DDirectionalLightObjPtr;
  899.  
  900. /*==============================================================================
  901.  *    PointLight
  902.  *
  903.  *    attenuation = 1/(c0 + c1*d + c2 + d^2), d is the distance from location
  904.  *    0 < c0, c1,c2
  905.  *    attenuation is not clamped to [0,1] to allow for lighting washout
  906.  *
  907.  *    Optionally followed by:
  908.  *        MF3DLightDataObjPtr        lightData;            { 0-1 }
  909.  *==============================================================================
  910.  */
  911. #define    kMF3DObjPointLight                        MF3DObjectType('p','n','t','l')
  912. #define    kMF3DObjPointLightText                    "PointLight"
  913.  
  914. typedef    struct MF3DAttenuation
  915. {    MF3DFloat32                c0;
  916.     MF3DFloat32                c1;
  917.     MF3DFloat32                c2;
  918. } MF3DAttenuation;
  919.  
  920. typedef    struct MF3DPointLightObj
  921. {    MF3DObjHeader
  922.     MF3DPoint3D                location;
  923.     MF3DAttenuation            attenuation;
  924.     MF3DBoolean                castsShadows;
  925. } MF3DPointLightObj, *MF3DPointLightObjPtr;
  926.  
  927. /*==============================================================================
  928.  *    SpotLight
  929.  *
  930.  *    |orientation| = 1
  931.  *    0 < hotAngle <= outerAngle <= pi
  932.  *==============================================================================
  933.  */
  934. #define    kMF3DObjSpotLight                        MF3DObjectType('s','p','o','t')
  935. #define    kMF3DObjSpotLightText                    "SpotLight"
  936.  
  937. enum MF3DFallOffEnum
  938. {    MF3DFallOffNone            = 0x00000000,
  939.     MF3DFallOffLinear        = 0x00000001,
  940.     MF3DFallOffExponential    = 0x00000002,
  941.     MF3DFallOffCosine        = 0x00000003
  942. };
  943. typedef    MF3DEnumData    MF3DFallOffEnum;
  944.  
  945. typedef    struct MF3DSpotLightObj
  946. {    MF3DObjHeader
  947.     MF3DPoint3D                location;
  948.     MF3DVector3D            orientation;
  949.     MF3DBoolean                castsShadows;
  950.     MF3DAttenuation            attenuation;
  951.     MF3DFloat32                hotAngle;
  952.     MF3DFloat32                outerAngle;
  953.     MF3DFallOffEnum            fallOff;
  954. } MF3DSpotLightObj, *MF3DSpotLightObjPtr;
  955.  
  956. /*==============================================================================
  957.  *    LambertIllumination
  958.  *==============================================================================
  959.  */
  960. #define    kMF3DObjLambertIllumination                MF3DObjectType('l','m','i','l')
  961. #define    kMF3DObjLambertIlluminationText            "LambertIllumination"
  962.  
  963. typedef    struct MF3DLambertIlluminationObj
  964. {    MF3DObjHeader
  965. } MF3DLambertIlluminationObj, *MF3DLambertIlluminationObjPtr;
  966.  
  967. /*==============================================================================
  968.  *    PhongIllumination
  969.  *==============================================================================
  970.  */
  971. #define    kMF3DObjPhongIllumination                MF3DObjectType('p','h','i','l')
  972. #define    kMF3DObjPhongIlluminationText            "PhongIllumination"
  973.  
  974. typedef    struct MF3DPhongIlluminationObj
  975. {    MF3DObjHeader
  976. } MF3DPhongIlluminationObj, *MF3DPhongIlluminationObjPtr;
  977.  
  978. /*==============================================================================
  979.  *    PixmapTexture
  980.  *
  981.  *    0 < width
  982.  *    0 < height
  983.  *    0 < pixelSize < 32
  984.  *    width * pixelSize ≤ rowBytes
  985.  *==============================================================================
  986.  */
  987. #define    kMF3DObjPixmapTexture                    MF3DObjectType('t','x','p','m')
  988. #define    kMF3DObjPixmapTextureText                "PixmapTexture"
  989.  
  990. enum MF3DPixelTypeEnum
  991. {    MF3DPixelRGB8            = 0x00000000,
  992.     MF3DPixelRGB16            = 0x00000001,
  993.     MF3DPixelRGB24            = 0x00000002,
  994.     MF3DPixelRGB32            = 0x00000003
  995. };
  996. typedef    MF3DEnumData    MF3DPixelTypeEnum;
  997.  
  998. enum MF3DEndianEnum
  999. {    MF3DEndianBigEndian        = 0x00000000,
  1000.     MF3DEndianLittleEndian    = 0x00000001
  1001. };
  1002. typedef    MF3DEnumData    MF3DEndianEnum;
  1003.  
  1004. typedef    struct MF3DPixmapTextureObj
  1005. {    MF3DObjHeader
  1006.     MF3DUns32                width;
  1007.     MF3DUns32                height;
  1008.     MF3DUns32                rowBytes;
  1009.     MF3DUns32                pixelSize;
  1010.     MF3DPixelTypeEnum        pixelType;
  1011.     MF3DEndianEnum            bitOrder;
  1012.     MF3DEndianEnum            byteOrder;
  1013.     MF3DRawDataPtr            image;                /* size: rowBytes * height*/
  1014. } MF3DPixmapTextureObj, *MF3DPixmapTextureObjPtr;
  1015.  
  1016. /*==============================================================================
  1017.  *    TextureShader
  1018.  *
  1019.  *    Always followed by:
  1020.  *        MF3DPixmapTextureObjPtr    pixmapTexture;        { 1 }
  1021.  *==============================================================================
  1022.  */
  1023. #define    kMF3DObjTextureShader                    MF3DObjectType('t','x','s','u')
  1024. #define    kMF3DObjTextureShaderText                "TextureShader"
  1025.  
  1026. typedef    struct MF3DTextureShaderObj
  1027. {    MF3DObjHeader
  1028. } MF3DTextureShaderObj, *MF3DTextureShaderObjPtr;
  1029.  
  1030. /*==============================================================================
  1031.  *    BackfacingStyle
  1032.  *==============================================================================
  1033.  */
  1034. #define    kMF3DObjBackfacingStyle                    MF3DObjectType('b','c','k','f')
  1035. #define    kMF3DObjBackfacingStyleText                "BackfacingStyle"
  1036.  
  1037. enum MF3DBackfacingEnum
  1038. {    MF3DBackfacingBoth        = 0x00000000,
  1039.     MF3DBackfacingCulled    = 0x00000001,
  1040.     MF3DBackfacingFlipped    = 0x00000002
  1041. };
  1042. typedef    MF3DEnumData    MF3DBackfacingEnum;
  1043.  
  1044. typedef    struct MF3DBackfacingStyleObj
  1045. {    MF3DObjHeader
  1046.     MF3DBackfacingEnum        backfacing;
  1047. } MF3DBackfacingStyleObj, *MF3DBackfacingStyleObjPtr;
  1048.  
  1049. /*==============================================================================
  1050.  *    FillStyle
  1051.  *==============================================================================
  1052.  */
  1053. #define    kMF3DObjFillStyle                        MF3DObjectType('f','i','s','t')
  1054. #define    kMF3DObjFillStyleText                    "FillStyle"
  1055.  
  1056. enum MF3DFillStyleEnum
  1057. {    MF3DFillStyleFilled        = 0x00000000,
  1058.     MF3DFillStyleEdges        = 0x00000001,
  1059.     MF3DFillStylePoints        = 0x00000002,
  1060.     MF3DFillStyleEmpty        = 0x00000003
  1061. };
  1062. typedef    MF3DEnumData    MF3DFillStyleEnum;
  1063.  
  1064. typedef    struct MF3DFillStyleObj
  1065. {    MF3DObjHeader
  1066.     MF3DFillStyleEnum        fillStyle;
  1067. } MF3DFillStyleObj, *MF3DFillStyleObjPtr;
  1068.  
  1069. /*==============================================================================
  1070.  *    HighlightStyle
  1071.  *
  1072.  *    Always followed by:
  1073.  *        MF3DAttributeSetListObjPtr            attributes;            { 1 }
  1074.  *==============================================================================
  1075.  */
  1076. #define    kMF3DObjHighlightStyle                    MF3DObjectType('h','i','g','h')
  1077. #define    kMF3DObjHighlightStyleText                "HighlightStyle"
  1078.  
  1079. typedef    struct MF3DHighlightStyleObj
  1080. {    MF3DObjHeader
  1081. } MF3DHighlightStyleObj, *MF3DHighlightStyleObjPtr;
  1082.  
  1083. /*==============================================================================
  1084.  *    InterpolationStyle
  1085.  *==============================================================================
  1086.  */
  1087. #define    kMF3DObjInterpolationStyle                MF3DObjectType('i','n','t','p')
  1088. #define    kMF3DObjInterpolationStyleText            "InterpolationStyle"
  1089.  
  1090. enum MF3DInterpolationStyleEnum
  1091. {    MF3DInterpolationStyleNone        = 0x00000000,
  1092.     MF3DInterpolationStyleVertex    = 0x00000001,
  1093.     MF3DInterpolationStylePixel        = 0x00000002
  1094. };
  1095. typedef    MF3DEnumData    MF3DInterpolationStyleEnum;
  1096.  
  1097. typedef    struct MF3DInterpolationStyleObj
  1098. {    MF3DObjHeader
  1099.     MF3DInterpolationStyleEnum    interpolationStyle;
  1100. } MF3DInterpolationStyleObj, *MF3DInterpolationStyleObjPtr;
  1101.  
  1102. /*==============================================================================
  1103.  *    OrientationStyle
  1104.  *==============================================================================
  1105.  */
  1106. #define    kMF3DObjOrientationStyle                MF3DObjectType('o','r','n','t')
  1107. #define    kMF3DObjOrientationStyleText            "OrientationStyle"
  1108.  
  1109. enum MF3DOrientationStyleEnum
  1110. {    MF3DOrientationCCW        = 0x00000000,
  1111.     MF3DOrientationCW        = 0x00000001
  1112. };
  1113. typedef    MF3DEnumData    MF3DOrientationStyleEnum;
  1114.  
  1115. typedef    struct MF3DOrientationStyleObj
  1116. {    MF3DObjHeader
  1117.     MF3DOrientationStyleEnum    orientationStyle;
  1118. } MF3DOrientationStyleObj, *MF3DOrientationStyleObjPtr;
  1119.  
  1120. /*==============================================================================
  1121.  *    PickIDStyle
  1122.  *==============================================================================
  1123.  */
  1124. #define    kMF3DObjPickIDStyle                        MF3DObjectType('p','k','i','d')
  1125. #define    kMF3DObjPickIDStyleText                    "PickIDStyle"
  1126.  
  1127. typedef    struct MF3DPickIDStyleObj
  1128. {    MF3DObjHeader
  1129.     MF3DUns32                id;
  1130. } MF3DPickIDStyleObj, *MF3DPickIDStyleObjPtr;
  1131.  
  1132. /*==============================================================================
  1133.  *    PickPartsStyle
  1134.  *==============================================================================
  1135.  */
  1136. #define    kMF3DObjPickPartsStyle                    MF3DObjectType('p','k','p','t')
  1137. #define    kMF3DObjPickPartsStyleText                "PickPartsStyle"
  1138.  
  1139. enum MF3DPickPartsFlags
  1140. {    MF3DPickPartsObject        = 0x00000000,
  1141.     MF3DPickPartsFace        = 0x00000001,
  1142.     MF3DPickPartsEdge        = 0x00000002,
  1143.     MF3DPickPartsVertex        = 0x00000004,
  1144.     MF3DPickPartsDefault    = MF3DPickPartsObject
  1145. };
  1146. typedef    MF3DFlagData    MF3DPickPartsFlags;
  1147.     
  1148. typedef    struct MF3DPickPartsStyleObj
  1149. {    MF3DObjHeader
  1150.     MF3DPickPartsFlags        pickParts;
  1151. } MF3DPickPartsStyleObj, *MF3DPickPartsStyleObjPtr;
  1152.  
  1153. /*==============================================================================
  1154.  *    ReceiveShadowsStyle
  1155.  *==============================================================================
  1156.  */
  1157. #define    kMF3DObjReceiveShadowsStyle                MF3DObjectType('r','c','s','h')
  1158. #define    kMF3DObjReceiveShadowsStyleText            "ReceiveShadowsStyle"
  1159.  
  1160. typedef    struct MF3DReceiveShadowsStyleObj
  1161. {    MF3DObjHeader
  1162.     MF3DBoolean                receiveShadows;
  1163. } MF3DReceiveShadowsStyleObj, *MF3DReceiveShadowsStyleObjPtr;
  1164.  
  1165. /*==============================================================================
  1166.  *    SubdivisionStyle
  1167.  *==============================================================================
  1168.  */
  1169. #define    kMF3DObjSubdivisionStyle                MF3DObjectType('s','b','d','v')
  1170. #define    kMF3DObjSubdivisionStyleText            "SubdivisionStyle"
  1171.  
  1172. enum MF3DSubdivisionMethodEnum
  1173. {    MF3DSubdivisionConstant        = 0x00000000,
  1174.     MF3DSubdivisionWorldSpace    = 0x00000001,
  1175.     MF3DSubdivisionScreenSpace    = 0x00000002
  1176. };
  1177. typedef    MF3DEnumData    MF3DSubdivisionMethodEnum;
  1178.  
  1179. typedef struct MF3DSubdivisionConstantData
  1180. {    MF3DUns32                value1;
  1181.     MF3DUns32                value2;
  1182. } MF3DSubdivisionConstantData;
  1183.  
  1184. typedef struct MF3DSubdivisionSpaceData
  1185. {    MF3DFloat32                value1;
  1186. } MF3DSubdivisionSpaceData;
  1187.  
  1188. typedef union
  1189. {    MF3DSubdivisionConstantData    constant;
  1190.     MF3DSubdivisionSpaceData    space;
  1191. } MF3DSubdivisionData;
  1192.  
  1193. typedef    struct MF3DSubdivisionStyleObj
  1194. {    MF3DObjHeader
  1195.     MF3DSubdivisionMethodEnum    subdivisionMethod;
  1196.     MF3DSubdivisionData            subdivisionData;
  1197. } MF3DSubdivisionStyleObj, *MF3DSubdivisionStyleObjPtr;
  1198.  
  1199. /*==============================================================================
  1200.  *    Matrix
  1201.  *
  1202.  *    matrix is invertible
  1203.  *==============================================================================
  1204.  */
  1205. #define    kMF3DObjMatrixTransform                    MF3DObjectType('m','t','r','x')
  1206. #define    kMF3DObjMatrixTransformText                "Matrix"
  1207.  
  1208. typedef    struct MF3DMatrixObj
  1209. {    MF3DObjHeader
  1210.     MF3DMatrix4x4            matrix;
  1211. } MF3DMatrixObj, *MF3DMatrixObjPtr;
  1212.  
  1213. /*==============================================================================
  1214.  *    Quaternion
  1215.  *==============================================================================
  1216.  */
  1217. #define    kMF3DObjQuaternionTransform                MF3DObjectType('q','t','r','n')
  1218. #define    kMF3DObjQuaternionTransformText            "Quaternion"
  1219.  
  1220. typedef    struct MF3DQuaternion
  1221. {    MF3DFloat32                w;
  1222.     MF3DFloat32                x;
  1223.     MF3DFloat32                y;
  1224.     MF3DFloat32                z;
  1225. } MF3DQuaternion;
  1226.  
  1227. typedef    struct MF3DQuaternionObj
  1228. {    MF3DObjHeader
  1229.     MF3DQuaternion            quaternion;
  1230. } MF3DQuaternionObj, *MF3DQuaternionObjPtr;
  1231.  
  1232. /*==============================================================================
  1233.  *    Rotate
  1234.  *==============================================================================
  1235.  */
  1236. #define    kMF3DObjRotateTransform                    MF3DObjectType('r','o','t','t')
  1237. #define    kMF3DObjRotateTransformText                "Rotate"
  1238.  
  1239. enum MF3DAxisEnum
  1240. {    MF3DAxisX                = 0x00000000,
  1241.     MF3DAxisY                = 0x00000001,
  1242.     MF3DAxisZ                = 0x00000002
  1243. };
  1244. typedef    MF3DEnumData    MF3DAxisEnum;
  1245.  
  1246. typedef    struct MF3DRotateObj
  1247. {    MF3DObjHeader
  1248.     MF3DAxisEnum            axis;
  1249.     MF3DFloat32                radians;
  1250. } MF3DRotateObj, *MF3DRotateObjPtr;
  1251.  
  1252. /*==============================================================================
  1253.  *    RotateAboutAxis
  1254.  *
  1255.  *    |orientation| = 1
  1256.  *==============================================================================
  1257.  */
  1258. #define    kMF3DObjRotateAboutAxisTransform        MF3DObjectType('r','t','a','a')
  1259. #define    kMF3DObjRotateAboutAxisTransformText    "RotateAboutAxis"
  1260.  
  1261. typedef    struct MF3DRotateAboutAxisObj
  1262. {    MF3DObjHeader
  1263.     MF3DPoint3D                origin;
  1264.     MF3DVector3D            orientation;
  1265.     MF3DFloat32                radians;
  1266. } MF3DRotateAboutAxisObj, *MF3DRotateAboutAxisObjPtr;
  1267.  
  1268. /*==============================================================================
  1269.  *    RotateAboutPoint
  1270.  *==============================================================================
  1271.  */
  1272. #define    kMF3DObjRotateAboutPointTransform        MF3DObjectType('r','t','a','p')
  1273. #define    kMF3DObjRotateAboutPointTransformText    "RotateAboutPoint"
  1274.  
  1275. typedef    struct MF3DRotateAboutPointObj
  1276. {    MF3DObjHeader
  1277.     MF3DAxisEnum            axis;
  1278.     MF3DFloat32                radians;
  1279.     MF3DPoint3D                origin;
  1280. } MF3DRotateAboutPointObj, *MF3DRotateAboutPointObjPtr;
  1281.  
  1282. /*==============================================================================
  1283.  *    Scale
  1284.  *==============================================================================
  1285.  */
  1286. #define    kMF3DObjScaleTransform                    MF3DObjectType('s','c','a','l')
  1287. #define    kMF3DObjScaleTransformText                "Scale"
  1288.  
  1289. typedef    struct MF3DScaleObj
  1290. {    MF3DObjHeader
  1291.     MF3DVector3D            scale;
  1292. } MF3DScaleObj, *MF3DScaleObjPtr;
  1293.  
  1294. /*==============================================================================
  1295.  *    Translate
  1296.  *==============================================================================
  1297.  */
  1298. #define    kMF3DObjTranslateTransform                MF3DObjectType('t','r','n','s')
  1299. #define    kMF3DObjTranslateTransformText            "Translate"
  1300.  
  1301. typedef    struct MF3DTranslateObj
  1302. {    MF3DObjHeader
  1303.     MF3DVector3D            translate;
  1304. } MF3DTranslateObj, *MF3DTranslateObjPtr;
  1305.  
  1306. /*==============================================================================
  1307.  *    MacintoshPath
  1308.  *==============================================================================
  1309.  */
  1310. #define    kMF3DObjMacintoshPath                    MF3DObjectType('a','l','i','s')
  1311. #define    kMF3DObjMacintoshPathText                "MacintoshPath"
  1312.  
  1313. typedef    struct MF3DMacintoshPathObj
  1314. {    MF3DObjHeader
  1315.     MF3DCStringPtr            pathName;
  1316. } MF3DMacintoshPathObj, *MF3DMacintoshPathObjPtr;
  1317.  
  1318. /*==============================================================================
  1319.  *    UnixPath
  1320.  *==============================================================================
  1321.  */
  1322. #define    kMF3DObjUnixPath                        MF3DObjectType('u','n','i','x')
  1323. #define    kMF3DObjUnixPathText                    "UnixPath"
  1324.  
  1325. typedef    struct MF3DUnixPathObj
  1326. {    MF3DObjHeader
  1327.     MF3DCStringPtr            pathName;
  1328. } MF3DUnixPathObj, *MF3DUnixPathObjPtr;
  1329.  
  1330. /*==============================================================================
  1331.  *    CString
  1332.  *==============================================================================
  1333.  */
  1334. #define    kMF3DObjCString                            MF3DObjectType('s','t','r','c')
  1335. #define    kMF3DObjCStringText                        "CString"
  1336.  
  1337. typedef    struct MF3DCStringObj
  1338. {    MF3DObjHeader
  1339.     MF3DCStringPtr            cString;
  1340. } MF3DCStringObj, *MF3DCStringObjPtr;
  1341.  
  1342. /*==============================================================================
  1343.  *    Unicode
  1344.  *==============================================================================
  1345.  */
  1346. #define    kMF3DObjUnicode                            MF3DObjectType('u','n','c','d')
  1347. #define    kMF3DObjUnicodeText                        "Unicode"
  1348.  
  1349. typedef    struct MF3DUnicodeObj
  1350. {    MF3DObjHeader
  1351.     MF3DUns32                length;
  1352.     MF3DRawDataPtr            unicode;            /* size: length * 2    */
  1353. } MF3DUnicodeObj, *MF3DUnicodeObjPtr;
  1354.  
  1355. /*==============================================================================
  1356.  *    ImageDimensions
  1357.  *
  1358.  *    0 < width
  1359.  *    0 < height
  1360.  *==============================================================================
  1361.  */
  1362. #define    kMF3DObjImageDimensions                    MF3DObjectType('i','m','d','m')
  1363. #define    kMF3DObjImageDimensionsText                "ImageDimensions"
  1364.  
  1365. typedef struct MF3DImageDimensionsObj
  1366. {    MF3DObjHeader
  1367.     MF3DUns32            width;
  1368.     MF3DUns32            height;
  1369. } MF3DImageDimensionsObj, *MF3DImageDimensionsObjPtr;
  1370.  
  1371. /*==============================================================================
  1372.  *    ImageMask
  1373.  
  1374.  *    width, height in bits
  1375.  *    0 < width 
  1376.  *    0 < height
  1377.  *    ((width >> 3) + ((width & 0x7) ? 1 : 0)) ≤ rowBytes
  1378.  *==============================================================================
  1379.  */
  1380. #define    kMF3DObjImageMask                        MF3DObjectType('i','m','m','k')
  1381. #define    kMF3DObjImageMaskText                    "ImageMask"
  1382.  
  1383. typedef struct MF3DImageMaskObj
  1384. {    MF3DObjHeader
  1385.     MF3DUns32            width;
  1386.     MF3DUns32            height;
  1387.     MF3DUns32            rowBytes;
  1388.     MF3DRawDataPtr        image;                /* size: rowBytes * height        */
  1389. } MF3DImageMaskObj, *MF3DImageMaskObjPtr;
  1390.  
  1391. /*==============================================================================
  1392.  *    ImageClearColor
  1393.  *==============================================================================
  1394.  */
  1395. #define    kMF3DObjImageClearColor                    MF3DObjectType('i','m','c','c')
  1396. #define    kMF3DObjImageClearColorText                "ImageClearColor"
  1397.  
  1398. typedef struct MF3DImageClearColorObj
  1399. {    MF3DObjHeader
  1400.     MF3DRGBColor        clearColor;
  1401. } MF3DImageClearColorObj, *MF3DImageClearColorObjPtr;
  1402.  
  1403. /*==============================================================================
  1404.  *    ViewHints
  1405.  *
  1406.  *    Optionally followed by:
  1407.  *        MF3DRendererObjPtr            renderer;            { 0-1 }
  1408.  *        MF3DCameraObjPtr            camera;                { 0-1 }
  1409.  *        MF3DLightsObjPtr            lights;                { 0-many }
  1410.  *        MF3DAttributeSetListObjPtr    attributes;            { 0-1 }
  1411.  *        MF3DImageDimensionsObjPtr    imageDimensions;    { 0-1 }
  1412.  *        MF3DImageMaskObjPtr            imageMask;            { 0-1 }
  1413.  *        MF3DImageClearColorObjPtr    imageClearColor;    { 0-1 }
  1414.  *==============================================================================
  1415.  */
  1416. #define    kMF3DObjViewHints                        MF3DObjectType('v','w','h','n')
  1417. #define    kMF3DObjViewHintsText                    "ViewHints"
  1418.  
  1419. typedef    MF3DVoidObjPtr    MF3DRendererObjPtr;
  1420. typedef    MF3DVoidObjPtr    MF3DCameraObjPtr;
  1421. typedef    MF3DVoidObjPtr    MF3DLightsObjPtr;
  1422.  
  1423. typedef    struct MF3DViewHintsObj
  1424. {    MF3DObjHeader
  1425. } MF3DViewHintsObj, *MF3DViewHintsObjPtr;
  1426.  
  1427. /*==============================================================================
  1428.  *    Shader
  1429.  *
  1430.  *    Optionally followed by:
  1431.  *        MF3DShaderDataObjPtr        shaderData;            { 0-1 }
  1432.  *        MF3DShaderTransformObjPtr    shaderTransform;    { 0-1 }
  1433.  *        MF3DShaderUVTransformObjPtr    shaderUVTransform;    { 0-1 }
  1434.  *==============================================================================
  1435.  */
  1436. typedef    MF3DVoidObjPtr            MF3DShaderDataPtr;
  1437.  
  1438. /*==============================================================================
  1439.  *    Unknown Type Object
  1440.  *
  1441.  *    Unrecognized objects are just stored as a stream of data.
  1442.  *    We use this object to return User-defined types. We could be even more
  1443.  *    adventurous and use it for any type we do not recognize.
  1444.  *==============================================================================
  1445.  */
  1446.  
  1447. /* Not an official type; so pick a value most likely not to
  1448.  * conflict with other types.
  1449.  */
  1450. #define    kMF3DObjUnknownType                        (MF3DObjType)0x80000000
  1451.  
  1452. /* objectType is kMF3DObjUnknownType.                                        */
  1453. typedef struct MF3DUnknownObj
  1454. {    MF3DObjHeader
  1455.     MF3DObjType                    realObjectType;
  1456.     MF3DCStringPtr                realObjectName;    /* (optional)                */
  1457.     MF3DDataFormatEnum            dataFormat;        /* binary, swapped, or text    */
  1458.     MF3DSize                    size;
  1459.     MF3DRawDataPtr                data;            /* size: size                */
  1460. } MF3DUnknownObj, *MF3DUnknownObjPtr;
  1461.  
  1462. /*==============================================================================
  1463.  *    Unrecognized Subobject List
  1464.  *
  1465.  *    Future versions of the metafile may support new subobject types.
  1466.  *    Unrecognized subobjects are stored in an array.
  1467.  *==============================================================================
  1468.  */
  1469. struct MF3DUnknownSubobjList
  1470. {    MF3DUns32            nSubObjects;
  1471.     MF3DUnknownObjPtr    subObjects;            /* size: nSubObjects            */
  1472. };
  1473.  
  1474. #endif
  1475.